from rest_framework.generics import CreateAPIView, GenericAPIView
from rest_framework import mixins
from rest_framework.permissions import IsAuthenticated
from rest_framework.viewsets import GenericViewSet

from utils.base_views import MultipleDestroyMixin
from utils.pageination import GlobalPagination
from ..models import UserModel
from ..serializers import UserRegisterSerializer, UserUpdateOrDeleteSerializer, UserGetSerializer, ResetPasswordSerializer


class RegisterView(CreateAPIView):
    """
    create：
    注册用户
    参数：
    username， password， phone必须传递， phone和real_name可选参数， return：添加之后的user对象
    """
    queryset = UserModel.objects.all()
    serializer_class = UserRegisterSerializer

    # permission_classes = [IsAuthenticated]

    def authenticate(self, request, username=None, password=None, **kwargs):
        """
        实现用户认证
        :param request:
        :param username:
        :param password:
        :param kwargs:
        :return:
        """
        try:
            user = UserModel.objects.get(username=username)
        except:
            return None
        # 判断密码
        if user.check_password(password):
            return user  # 把user对象放到request对象中


# 当前视图类， 除了用户注册和密码修改之外， 其他所有用户管理操作
class UserView(mixins.UpdateModelMixin,
               mixins.RetrieveModelMixin,
               mixins.DestroyModelMixin,
               mixins.ListModelMixin,
               MultipleDestroyMixin,
               GenericViewSet,
               ):
    """
    create:
    用户--新增
    status： 201（成功）， return：新增用户信息

    destroy：
    用户--删除 单个用户
    status： 204（成功）， return：None

    multiple_destroy：
    用户--批量删除 多个用户
    status： 204（成功）， return：None

    update：
    用户--修改  修改用户本身的信息（属性）, 还包括用户的手机号码和真实姓名
    status： 200（成功）， return：修改增用户信息

    partial_update：
    用户--修改  修改用户本身的信息（属性）
    status： 200（成功）， return：修改增用户信息

    retrieve:
    查询某一个用户

    list:
    查询用户列表
    """
    queryset = UserModel.objects.all()
    pagination_class = GlobalPagination

    def get_serializer_class(self):
        # 如果修改和删除的操作，使用一个统一的序列化
        if self.action == "partial_update" or self.action == "update" or self.action == "destroy":
            return UserUpdateOrDeleteSerializer
        else:
            return UserGetSerializer


class ResetPasswordView(mixins.UpdateModelMixin, GenericAPIView):
    """
    PATCH:
    用户重置密码：需要输入原始密码， 新密码和新密码的确认
    重置密码： status: 200（成功）， return：修改之后的用户， 但不显示密码
    """
    queryset = UserModel.objects.all()
    serializer_class = ResetPasswordSerializer

    def patch(self, request, *args, **kwargs):
        return self.partial_update(request, *args, **kwargs)
